from PySide6.QtWidgets import QApplication, QSizePolicy, QPushButton, QWidget, QGroupBox, QCheckBox, QVBoxLayout, QHBoxLayout, QRadioButton, QButtonGroup
import sys

class CustomWidget(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle('11_QLabel_QCheckBox_QRadioButton_复选框和单选框')

        # >>>>> 本示例中还有 QButtonGroup 的使用方法

        # 1. 使用 QGroupBox 创建组布局
        # 1.1 初始化组部件及其附属子部件
        group_box_01 = QGroupBox("选择操作系统：")

        check_box_win = QCheckBox('Windows')
        check_box_win.toggled.connect(self.group_box_toggled) 
        check_box_linux = QCheckBox('Linux')
        check_box_linux.toggled.connect(self.group_box_toggled) 
        check_box_mac = QCheckBox('Mac')
        check_box_mac.toggled.connect(self.group_box_toggled) 

        # 1.2 QGroupBox 子部件布局组装
        check_box_group_layout = QVBoxLayout()
        check_box_group_layout.addWidget(check_box_win) 
        check_box_group_layout.addWidget(check_box_linux) 
        check_box_group_layout.addWidget(check_box_mac) 

        # 1.3 QGroupBox 组部件指定布局
        group_box_01.setLayout(check_box_group_layout)

        # 2. 使用同样的方法创建第二个 QGroupBox, 此时指定复选框只能单选：Exclusive checkbox
        group_box_02 = QGroupBox("选择饮料：")

        check_box_21 = QCheckBox('矿泉水')
        check_box_22 = QCheckBox('热水')
        check_box_23 = QCheckBox('凉白开')

        check_box_group_layout2 = QVBoxLayout()
        check_box_group_layout2.addWidget(check_box_21) 
        check_box_group_layout2.addWidget(check_box_22) 
        check_box_group_layout2.addWidget(check_box_23) 

         # 2.1 设置复选框按钮组，并指定组内只能单选
        exclusive_btn_group = QButtonGroup(self)
        exclusive_btn_group.addButton(check_box_21) 
        exclusive_btn_group.addButton(check_box_22) 
        exclusive_btn_group.addButton(check_box_23) 
        exclusive_btn_group.setExclusive(True)  # 设置复选框只能单选
        check_box_21.setChecked(True)           # 默认选中
        check_box_22.setCheckable(False)        # 设置可选（虽然不能选，但是展示样式并没有变）
        
        group_box_02.setLayout(check_box_group_layout2)

        # 2. 使用 QRadioButton
        group_box_radio = QGroupBox("选择消遣方式：")

        radio_btn_31 = QRadioButton('吃饭')
        radio_btn_32 = QRadioButton('睡觉')
        radio_btn_33 = QRadioButton('打豆豆')
        radio_btn_31.setChecked(True)

        check_box_group_layout3 = QVBoxLayout()
        check_box_group_layout3.addWidget(radio_btn_31) 
        check_box_group_layout3.addWidget(radio_btn_32) 
        check_box_group_layout3.addWidget(radio_btn_33) 
        group_box_radio.setLayout(check_box_group_layout3)


        # ================= 总体布局 =================
        # 第一组件，使用水平布局，包裹两个复选框的 QGroupBox
        layout_01 = QHBoxLayout()
        layout_01.addWidget(group_box_01)
        layout_01.addWidget(group_box_02)
        
        # 第二组件，封装单选框的 QGroupBox
        layout_02 = QVBoxLayout()
        layout_02.addWidget(group_box_radio)

        # 整体布局，垂直布局1，2组件
        layout = QVBoxLayout()  
        layout.addLayout(layout_01)
        layout.addLayout(layout_02)

        self.setLayout(layout)


    
    def group_box_toggled(self, checked):
        print(checked)
    

app = QApplication(sys.argv)

window = CustomWidget()
window.show()

app.exec()
